home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Internet Surfer: Getting Started
/
Internet Surfer - Getting Started (Wayzata Technology)(7231)(1995).bin
/
pc
/
mac
/
bonus
/
peter_le
/
dehqx-20
/
preferen.p
< prev
next >
Wrap
Text File
|
1991-08-23
|
12KB
|
490 lines
unit Preferences;
{ DeHQX v2.0.0 ⌐ Peter Lewis, Aug 1991 }
interface
uses
MyTypes, MyUtilities, MyFileSystem, MyStandardFile, Folders, MySystem7, AppGlobals;
type
{ DONT REORDER THIS RECORD OR THESE TYPES! }
promptStates = (PS_Always, PS_Exists, PS_Overwrite, PS_Unique, PS_Skip);
createDirStates = (CDS_Always, CDS_Folder, CDS_Never);
displayStates = (DS_All, DS_TEXT, DS_HQX);
preferencesType = record
version: integer;
prompt_state: promptStates;
create_dir_state: createDirStates;
display_state: displayStates;
beep_state: boolean;
delete_state: boolean;
parts_state: boolean;
startup_state: boolean;
auto_quit_state: boolean;
notify_state: boolean;
demand_thisfile_state: boolean;
{space for future expansion (rapidly shrinking!) }
dummy4, dummy5, dummy6: boolean; { not packed }
{added for version 1.1.2 }
drop_folder: boolean; { drop folder enabled }
drop_dirID: longInt; { -1 for invalid directories }
case boolean of
true: ( { In memory }
drop_vrn: integer
);
false: ( { On Disk }
drop_CrDate: longInt;
drop_Volume: str63
);
end;
const
Pref_Save_item = 1;
Pref_Default_Item = Pref_Save_item;
Pref_Cancel_item = 2;
Pref_OK_item = 3;
var
prefs: preferencesType;
prefs_dialog: dialogPtr; { nil if no window open }
procedure InitPreferences;
function FinishPreferences: boolean;
procedure GetPreferences (wdrn: integer; dirID: longInt; name: str63); { used for ODoc/Params }
procedure OpenPreferences;
procedure HandlePrefItem (item: integer);
procedure ClosePreferences;
implementation
const
nonotify_version = $102;
notify_version = $106;
pre_drop_size = 16;
drop_version = $112;
current_version = $112;
User_item = 4;
PS_item = 5;
PS_items = 5;
PS_iteml = PS_item + PS_items - 1;
CDS_item = 10;
CDS_items = 3;
CDS_iteml = CDS_item + CDS_items - 1;
DS_item = 13;
DS_items = 3;
DS_iteml = DS_item + DS_items - 1;
PaS_item = 16;
DTFS_item = 17;
StS_item = 18;
DFS_item = 19;
DeS_item = 20;
BeS_item = 21;
FAS_item = 22;
AQS_item = 23;
DFB_item = 24;
type
prefP = ^preferencesType;
prefH = ^prefP;
var
noAlert: boolean;
prefVRN: integer;
prefDirID: longInt;
dialog_vrn: integer;
dialog_DirID: longInt;
prefs_dialog_dirty: boolean;
procedure GetPrefVRN;
var
oe: OSErr;
vrn: integer;
crdate: longInt;
begin
with prefs do begin
if (drop_volume = '') or (drop_dirID = -1) then
oe := myErr
else begin
vrn := 0;
oe := GetVolInfo(drop_volume, vrn, -1, crdate);
if (oe = noErr) and (crdate <> drop_crdate) then
oe := myErr;
if oe = noErr then
if not MFSDirExists(vrn, drop_dirID, '') then
oe := myErr;
end;
if oe <> noErr then
drop_folder := false;
if oe = noErr then begin
drop_vrn := vrn;
end
else begin
drop_vrn := 0;
drop_dirID := -1;
end;
end;
end;
procedure InitPreferences;
var
oe: OSErr;
name: str63;
pb: HParamBlockRec;
h: prefH;
wd: integer;
begin
noAlert := false;
with prefs do begin
version := current_version;
prompt_state := PS_Exists;
create_dir_state := CDS_Folder;
display_state := DS_TEXT;
beep_state := true;
delete_state := false;
parts_state := true;
startup_state := true;
auto_quit_state := false;
notify_state := true;
demand_thisfile_state := false;
dummy4 := false;
dummy5 := false;
dummy6 := false;
drop_folder := false;
drop_DirID := -1;
drop_Volume := '';
end;
h := prefH(GetResource(pref_rsrc, pref_id));
if h <> nil then begin
prefs := h^^;
ReleaseResource(handle(h));
end;
prefVRN := sysenv.sysVRefNum;
prefDirID := 0;
oe := GetDirID(prefVRN, prefVRN, prefDirID);
oe := MyFindFolder(prefVRN, kPreferencesFolderType, prefVRN, prefDirID);
GetPrefVRN;
noAlert := true;
GetPreferences(prefVRN, prefDirID, GetGlobalString(pref_name));
noAlert := false;
prefs_dialog := nil;
end;
procedure GetPreferences (wdrn: integer; dirID: longInt; name: str63);
var
oe: OSErr;
rn, a: integer;
p: preferencesType;
count: longInt;
begin
oe := MyResolveAliasFile(wdrn, dirID, name);
if oe = noErr then
oe := MFSOpenDF(rn, wdrn, dirID, name, PIn);
if oe = noErr then begin
count := SizeOf(preferencesType);
oe := FSRead(rn, count, @p);
if oe = eofErr then
oe := noErr;
if (count = pre_drop_size) and (p.version < drop_version) then begin
p.drop_folder := false;
p.drop_DirID := -1;
p.drop_Volume := '';
count := SizeOf(preferencesType);
end;
if count <> SizeOf(preferencesType) then
oe := myErr;
if oe = noErr then begin
prefs := p;
if prefs.version < notify_version then
prefs.notify_state := true;
prefs.version := current_version;
GetPrefVRN;
end
else if not noAlert then
a := Alert(pref_read_alert_id, nil);
oe := FSClose(rn);
end;
end;
procedure SaveDefaults;
var
oe: OSErr;
rn, a: integer;
count: longInt;
p: preferencesType;
name: str63;
crdate: longInt;
begin
p := prefs;
with p do begin
if drop_dirID = -1 then
oe := myErr
else begin
name := '';
oe := GetVolInfo(name, drop_vrn, -1, crdate);
end;
if oe = noErr then begin
drop_volume := name;
drop_CrDate := crdate;
end
else begin
drop_folder := false;
drop_DirID := -1;
drop_CrDate := 0;
drop_Volume := '';
end;
end;
oe := MFSCreate(prefVRN, prefDirID, GetGlobalString(pref_name), myAppType, myAppType);
oe := MFSOpenDF(rn, prefVRN, prefDirID, GetGlobalString(pref_name), POut);
if oe = noErr then begin
count := SizeOf(preferencesType);
oe := FSWrite(rn, count, @p);
if count <> SizeOf(preferencesType) then
oe := myErr;
if (oe <> noErr) and not noAlert then
a := Alert(pref_write_alert_id, nil);
if oe = noErr then
oe := FSClose(rn);
end;
end;
function FinishPreferences: boolean;
begin
if prefs_dialog <> nil then
ClosePreferences;
FinishPreferences := prefs_dialog <> nil;
end;
function GetControl (dp: dialogPtr; item: integer): boolean;
var
kind: integer;
r: rect;
h: controlHandle;
begin
GetDItem(dp, item, kind, handle(h), r);
GetControl := GetCtlValue(h) <> 0;
end;
procedure SetControl (dp: dialogPtr; item: integer; on: boolean);
var
kind: integer;
r: rect;
h: controlHandle;
begin
GetDItem(dp, item, kind, handle(h), r);
SetCtlValue(h, ord(on));
prefs_dialog_dirty := true;
end;
procedure SetControls (dp: dialogPtr; first, count, value: integer);
var
i: integer;
begin
for i := 0 to count - 1 do
SetControl(dp, first + i, i = value);
end;
function GetControls (dp: dialogPtr; first, count: integer): integer;
var
i: integer;
begin
GetControls := 0;
for i := 0 to count - 1 do
if GetControl(dp, first + i) then
GetControls := i;
end;
procedure SetDropButton (dp: dialogPtr; folder: boolean; vrn: integer; dirID: longInt);
var
pb: HParamBlockRec;
name: str255;
oe: OSErr;
kind: integer;
h: handle;
r: rect;
begin
dialog_vrn := vrn;
dialog_dirID := dirID;
if dirID = -1 then
oe := myErr
else
with pb do begin
ioNamePtr := @name;
ioVRefNum := vrn;
ioFDirIndex := -1;
ioDirID := dirID;
oe := PBGetCatInfo(@pb, false);
end;
if oe <> noErr then begin
name := GetGlobalString(no_drop_folder);
folder := false;
end;
SetControl(dp, DFS_item, folder);
GetDItem(dp, DFB_item, kind, h, r);
SetCTitle(controlHandle(h), name);
prefs_dialog_dirty := true;
end;
procedure SetDialog (dp: dialogPtr);
begin
with prefs do begin
SetControls(dp, PS_item, PS_items, ord(prompt_state));
SetControls(dp, CDS_item, CDS_items, ord(create_dir_state));
SetControls(dp, DS_item, DS_items, ord(display_state));
SetControl(dp, BeS_item, beep_state);
SetControl(dp, DeS_item, delete_state);
SetControl(dp, PaS_item, parts_state);
SetControl(dp, DTFS_item, demand_thisfile_state);
SetControl(dp, StS_item, startup_state);
SetControl(dp, AQS_item, auto_quit_state);
SetControl(dp, FAS_item, notify_state);
SetDropButton(dp, drop_folder, drop_vrn, drop_DirID);
end;
end;
procedure SetPrefs (dp: dialogPtr);
begin
with prefs do begin
prompt_state := promptStates(GetControls(dp, PS_item, PS_items));
create_dir_state := createDirStates(GetControls(dp, CDS_item, CDS_items));
display_state := displayStates(GetControls(dp, DS_item, DS_items));
beep_state := GetControl(dp, BeS_item);
delete_state := GetControl(dp, DeS_item);
parts_state := GetControl(dp, PaS_item);
demand_thisfile_state := GetControl(dp, DTFS_item);
startup_state := GetControl(dp, StS_item);
auto_quit_state := GetControl(dp, AQS_item);
notify_state := GetControl(dp, FAS_item);
drop_folder := GetControl(dp, DFS_item);
drop_dirID := dialog_dirID;
drop_vrn := dialog_vrn;
end;
end;
procedure OutlineDefault (dp: dialogPtr; item: integer);
var
kind: integer;
h: handle;
r: rect;
begin
GetDItem(dp, Pref_Default_item, kind, h, r);
PenSize(3, 3);
InsetRect(r, -4, -4);
FrameRoundRect(r, 16, 16);
end;
procedure OpenPreferences;
var
item: integer;
kind: integer;
h: handle;
r: rect;
begin
if prefs_dialog <> nil then begin
if FrontWindow <> prefs_dialog then
SelectWindow(prefs_dialog);
end
else begin
SetVersionParamText('', '');
prefs_dialog := GetNewDialog(pref_dialog_id, nil, POINTER(-1));
GetDItem(prefs_dialog, Pref_Default_item, kind, h, r);
InsetRect(r, -10, -10);
SetDItem(prefs_dialog, User_item, userItem, handle(@OutlineDefault), r);
SetDialog(prefs_dialog);
prefs_dialog_dirty := false;
ShowWindow(prefs_dialog);
end;
end;
procedure HandlePrefItem (item: integer);
procedure CheckClick (item: integer);
begin
SetControl(prefs_dialog, item, not GetControl(prefs_dialog, item));
end;
var
reply: MySFReply;
typeList: SFTypeList;
dfs: boolean;
begin
with prefs do begin
case item of
PS_item..PS_iteml:
SetControls(prefs_dialog, PS_item, PS_items, item - PS_item);
CDS_item..CDS_iteml:
SetControls(prefs_dialog, CDS_item, CDS_items, item - CDS_item);
DS_item..DS_iteml:
SetControls(prefs_dialog, DS_item, DS_items, item - DS_item);
BeS_item:
CheckClick(BeS_item);
DeS_item:
CheckClick(DeS_item);
PaS_item:
CheckClick(PaS_item);
DTFS_item:
CheckClick(DTFS_item);
StS_item:
CheckClick(StS_item);
AQS_item:
CheckClick(AQS_item);
FAS_item:
CheckClick(FAS_item);
DFS_item:
begin
if GetControl(prefs_dialog, DFS_item) then
SetControl(prefs_dialog, DFS_item, false)
else if dialog_dirID = -1 then begin
GetFolder(nil, -1, typeList, get_folder_id, reply);
with reply do
if Rgood then
SetDropButton(prefs_dialog, true, RvRefNum, RdirID);
end
else
SetControl(prefs_dialog, DFS_item, true);
end;
DFB_item:
begin
if dialog_dirID <> -1 then
SetSFFile(dialog_vrn, dialog_dirID);
GetFolder(nil, -1, typeList, get_folder_id, reply);
with reply do
if Rgood then
SetDropButton(prefs_dialog, true, RvRefNum, RdirID);
end;
Pref_Save_item, Pref_OK_item, Pref_Cancel_item:
begin
if prefs_dialog_dirty and (item <> Pref_Cancel_item) then begin
SetPrefs(prefs_dialog);
if item = Pref_Save_item then
SaveDefaults;
end;
DisposDialog(prefs_dialog);
prefs_dialog := nil;
end;
otherwise
;
end;
end;
end;
procedure ClosePreferences;
var
dp: dialogPtr;
a: integer;
begin
if prefs_dialog_dirty then begin
if FrontWindow <> prefs_dialog then
SelectWindow(prefs_dialog);
a := Alert(pref_save_changes_alert_id, nil); { 1=Save, 2 = Cancel, 3=Discard }
end
else
a := 3;
if a = 1 then begin
SetPrefs(prefs_dialog);
SaveDefaults;
end;
if a <> 2 then begin
DisposDialog(prefs_dialog);
prefs_dialog := nil;
end;
end;
end.